#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
 

#define NUM 4


// 利用指针函数
typedef void (*function)();

function fun_arr[NUM];

void task1()
{
  printf("我在执行任务1\n");
}


void task2()
{
  printf("我在执行任务2\n");
}


void task3()
{
  printf("我在执行任务3\n");
}


void task4()
{
  printf("我在执行任务4\n");
}  

void InitArr()
{
    fun_arr[0] = task1;
    fun_arr[1] = task2;
    fun_arr[2] = task3;
    fun_arr[3] = task4;
}

   // 玩一玩多进程的waitpid回收
int main()
{
    pid_t ret = fork();
    
    // 用waitpid 处理子进程的僵尸进程状态
    if( ret == 0  )
    {
      int cnt = 5;
       while(cnt)
       {
         printf("我是子进程我的pid是:%d,cnt = %d\n" ,getpid() , cnt);
  
          cnt--;
        sleep(1);
         // 来一个异常退出看看
         // int text = 0 ;
         // cnt /= text   
       }
      // 5 秒后进程退出
      exit(0);
    }

   // 看看轮询非阻塞等待
   
    InitArr();
    
    int status = 0;
    while(1)
    {
       pid_t ret_Status = waitpid(ret , &status , WNOHANG);

       // 没有子进程可等待，说明子进程还在运行
       if(ret_Status == 0)
       {
          printf("没有等待到子进程,继续等待\n"); 

          // 展示，非阻塞等待的好处，父进程不必闲着
          int i;
          for( i = 0 ; i < NUM ; i++)
          {
             fun_arr[i]();
          }
        
          sleep(1);
       }
       if(ret_Status == ret)
       {
          printf("等到了子进程\n");
          break;
       }
       if(ret_Status == -1)
       {
          printf("调用异常\n");
          exit(-1);
       }
    }
    
                                                                                                                                                                                        
                                                                                              
     return 0;
}

